home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 16 / AMIGAplus Sonderheft 16 (1998)(ICP)(DE)[!].iso / pd / anwendungen / xpk_source / xpkmaster / hook_fh.c < prev    next >
C/C++ Source or Header  |  1998-08-27  |  4KB  |  150 lines

  1. #ifndef XPKMASTER_HOOK_FH_C
  2. #define XPKMASTER_HOOK_FH_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_fh.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_fh.c 1.5 (21.02.1997)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    File IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   01.01.97 : work around for sub library caused MungWall hits
  15.  1.2   10.01.97 : removed work around, because I found problem
  16.  1.3   29.03.97 : TOTSIZE now also in inhook
  17.  1.4   20.12.97 : file deletion now in outhook
  18.  1.5   21.02.98 : uses new style register definition
  19. */
  20.  
  21. #include <exec/types.h>
  22. #include <proto/dos.h>
  23. #include <proto/exec.h>
  24. #include "xpkmaster.h"
  25.  
  26. static LONG allociobuf(struct XpkMasterMsg *msg);
  27. static void freeiobuf(struct XpkMasterMsg *msg);
  28.  
  29. /****************************** read-from-fh hook **************************/
  30. static ASM(LONG) fhinfunc(REG(a1, struct XpkMasterMsg *msg))
  31. {
  32.   LONG wanted, epos;
  33.  
  34.   switch(msg->xmm_Type)
  35.   {
  36.   case XIO_SEEK:
  37.     if((msg->xmm_Size = Seek(msg->xmm_FH, msg->xmm_Size, OFFSET_CURRENT))<0)
  38.       return XPKERR_IOERRIN;
  39.     break;
  40.   case XIO_GETBUF:
  41.     if(allociobuf(msg))
  42.       return XPKERR_NOMEM;
  43.     msg->xmm_Ptr = msg->xmm_Buf;
  44.     break;
  45.   case XIO_READ:
  46.     if(!msg->xmm_Ptr)
  47.     {
  48.       if(allociobuf(msg))
  49.         return XPKERR_NOMEM;
  50.       msg->xmm_Ptr = msg->xmm_Buf;
  51.     }
  52.     wanted = msg->xmm_Size;
  53.     if((msg->xmm_Size = Read(msg->xmm_FH, msg->xmm_Ptr, wanted)) != wanted)
  54.       return msg->xmm_Size > 0 ? XPKERR_TRUNCATED : XPKERR_IOERRIN;
  55.     break;
  56.   case XIO_ABORT:
  57.   case XIO_FREE:
  58.     freeiobuf(msg);
  59.     if(msg->xmm_Flags & XMF_PRIVFH)
  60.     {
  61.       Close(msg->xmm_FH);
  62.       msg->xmm_FH = 0;
  63.     }
  64.     break;
  65.   case XIO_TOTSIZE:
  66.     if((wanted = Seek(msg->xmm_FH, 0, OFFSET_END)) < 0 ||
  67.     (epos = Seek(msg->xmm_FH, wanted, OFFSET_BEGINNING)) < 0)
  68.       return XPKERR_IOERRIN;
  69.     msg->xmm_Size = epos-wanted;
  70.     break;
  71.   }
  72.   return 0;
  73. }
  74.  
  75. struct Hook fhinhook = { {0}, (ULONG (*) ()) fhinfunc, 0, 0};
  76.  
  77. /****************************** write-to-fh hook **************************/
  78.  
  79. static ASM(LONG) fhoutfunc(REG(a1, struct XpkMasterMsg *msg))
  80. {
  81.   LONG wanted;
  82.  
  83.   switch(msg->xmm_Type)
  84.   {
  85.   case XIO_GETBUF:
  86.     if(allociobuf(msg))
  87.       return XPKERR_NOMEM;
  88.     msg->xmm_Ptr = msg->xmm_Buf;
  89.     break;
  90.   case XIO_WRITE:
  91.     wanted = msg->xmm_Size;
  92.     if((msg->xmm_Size = Write(msg->xmm_FH, msg->xmm_Ptr, wanted)) != wanted)
  93.       return XPKERR_IOERROUT;
  94.     break;
  95.   case XIO_SEEK:
  96.     if((msg->xmm_Size = Seek(msg->xmm_FH, msg->xmm_Size, OFFSET_CURRENT))<0)
  97.       return XPKERR_IOERROUT;
  98.     break;
  99.   case XIO_ABORT:
  100.   case XIO_FREE:
  101.     if(msg->xmm_Flags & XMF_PRIVFH)
  102.     {
  103.       Close(msg->xmm_FH);
  104.       msg->xmm_FH = 0;
  105.     }
  106.     freeiobuf(msg);
  107.     if(msg->xmm_Type == XIO_ABORT && msg->xmm_FileName)
  108.       DeleteFile(msg->xmm_FileName);
  109.     break;
  110.   }
  111.   return 0;
  112. }
  113.  
  114. struct Hook fhouthook = { {0}, (ULONG (*) ()) fhoutfunc,0 ,0};
  115.  
  116. /**************** free fh I/O buf ***************/
  117. static void freeiobuf(struct XpkMasterMsg *msg)
  118. {
  119.   if(msg->xmm_BufLen) /* clear buffer, when exists */
  120.   {
  121.     FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  122.     msg->xmm_BufLen = 0;
  123.   }
  124. }
  125.  
  126. /**************** alloc fh I/O buf ***************/
  127. static LONG allociobuf(struct XpkMasterMsg *msg)
  128. {
  129.   ULONG buflen = msg->xmm_Size;
  130.  
  131.   if(msg->xmm_BufLen >= buflen) /* buffer is large enough */
  132.     return 0;
  133.  
  134.   freeiobuf(msg); /* clear old buffer */
  135.  
  136.   if(!(msg->xmm_Buf = (STRPTR) AllocMem(buflen, msg->xmm_MemType)))
  137.     return XPKERR_NOMEM; /* get new one */
  138.  
  139.   msg->xmm_BufLen = buflen; /* set correct data */
  140.  
  141. #ifdef DEBUG
  142.   DebugRunTime("allociobuf: allocated buffer at %lx of size %ld",
  143.   msg->xmm_Buf, msg->xmm_BufLen);
  144. #endif
  145.  
  146.   return 0; /* all ok */
  147. }
  148.  
  149. #endif /* XPKMASTER_HOOK_FH_C */
  150.